#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<string>
// int main(int argc,char *argv[]){
//    while(true){
//     std::cout<<"Hello,world!"<<"   pid"<<getpid()<<std::endl;
//     raise(2);
//     sleep(1);
//    }
//     return 0;
// }
// int main(){
//     alarm(1);
//     int cnt=0;
//     while(true){
//         std::cout<<"Hello,world!"<<"   pid"<<getpid()
//         <<" "<<cnt++<<std::endl;
//     }
//     return 0;
// }
void PrintfPend(sigset_t &pending){
    for(int signo=1;signo<=31;signo++){
        if(sigismember(&pending, signo)){
            std::cout<<"1";
        }
        else{
            std::cout<<"0";
        }
    }
    std::cout<<std::endl;
}
void handler(int sig){
    std::cout<<"##############"<<std::endl;
    std::cout<<sig<<"已经收到信号"<<std::endl;
    sigset_t pending;
    int m=sigpending(&pending);
    PrintfPend(pending);
    std::cout<<"#################"<<std::endl;
    exit(0);
}
int main(){
    //屏蔽二号信号
    signal(SIGINT, handler);
    sigset_t block,oblock;//新旧集合
    sigemptyset(&block);
    sigemptyset(&oblock);
    // for(int i=0;i<32;i++){
    //     sigaddset(&block, i);
    // }屏蔽所有信号
    sigaddset(&block, SIGINT);//屏蔽二号信号
    int n=sigprocmask(SIG_SETMASK, &block, &oblock);
    //重复打印
    int cnt=0;
    while(true){
    //获取pending信号   
     sleep(1);
    std::cout<<"进程id"<<"("<<getpid()<<")"<<std::endl;
    sigset_t  pending;
    int m=sigpending(&pending);
    PrintfPend(pending);
    if(cnt==20){
        sigprocmask(SIG_SETMASK,&oblock,nullptr);
    }

    cnt++;  
    }
    
    return 0;
}